import { Color } from 'cc';
import { Layers } from 'cc';
import { Vec2 } from 'cc';
import { _decorator, Component, Node } from 'cc';
import DataMgr from './DataMgr';
const { ccclass, property } = _decorator;

@ccclass('Config')
export default class Config {
    // 超出后消除的数量
    static cleanCount: number = 10
    // 颜色数组的名字
    static dragColorArray: number[] = [-1, -1, -1, -1]
    static colorCount: number = 12
    
    // 等级配置
    static levelConfig: object

    // 展示二维数组
    static showMap(arr: number[][]) {
        for (var ix = 0; ix < arr.length; ix++) {
            var str = iz + " => "
            for (var iz = 0; iz < arr[ix].length; iz++) {
                str = str + arr[ix][iz] + ", "
            }
        }
    }

    // 将若干个数据从数组中移除
    static removeFromArray( arr, cleans ) {
        cleans.forEach(target => {
            const cIndex = arr.indexOf(target);
            if (cIndex !== -1) {
                arr.splice(cIndex, 1)
            }
        });
    }

    // 传入两个位置，判断其方向
    static getDir(oX: number, oZ: number, eX: number, eZ: number) {
        // 首先判断是否在同一平面
        if (oZ == eZ) {
            if (oX < eX) {
                return 4
            } else if (oX > oZ) {
                return 1
            }
        }

        if (eZ % 2 == 0) {
            // 凸出来
            if (oZ < eZ) {
                if (oX < eX) {
                    return 5
                } else {
                    return 0
                }
            } else {
                if (oX < eX) {
                    return 3
                } else {
                    return 2
                }
            }
        } else {
            // 凹进去
            if (oZ < eZ) {
                if (oX > oZ) {
                    return 0
                } else {
                    return 5
                }
            } else {
                if (oX > oZ) {
                    return 2
                } else {
                    return 3
                }
            }
        }
    }

    // 交换两个对象的位置
    static exchangeModelLoc(aModel: Node, bModel: Node) {

        const tempLoc = aModel.position.clone()

        aModel.position = bModel.position
        bModel.position = tempLoc
    }

    /**
     * 将秒数转换为倒计时格式
     * @param seconds 总秒数
     * @returns 倒计时的字符串，格式为 mm:ss
     */
    static formatCountdown(seconds: number): string {
        const minutes = Math.floor(seconds / 60); // 计算分钟数
        const remainingSeconds = Math.floor(seconds % 60); // 计算剩余的秒数

        // 格式化为两位数，不足两位补零
        const minutesStr = minutes < 10 ? `0${minutes}` : `${minutes}`;
        const secondsStr = remainingSeconds < 10 ? `0${remainingSeconds}` : `${remainingSeconds}`;

        return `${minutesStr}:${secondsStr}`;
    }
    
    /**
     * 对数字进行补零操作
     * @param num 需要补零的数字
     * @param length 目标字符串的长度
     * @returns 补零后的字符串
     */
    static padZero(num: number, length: number): string {
        // 将数字转换为字符串
        let numStr = num.toString();
        
        // 循环添加 "0" 直到字符串达到指定长度
        while (numStr.length < length) {
            numStr = "0" + numStr;
        }

        return numStr;
    }
    
    /**
     * 使用 Fisher-Yates 洗牌算法对数组进行随机排序
     * @param array 需要打乱的数组
     */
    public static shuffle<T>(array: T[]): T[] {
        for (let i = array.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1));
            [array[i], array[j]] = [array[j], array[i]];
        }

        return array;
    }
    

    /**
     * 获取16进制颜色.
     * @param hex 16进制字符串.
     */
    public static getHexColor(hex: string) {
        if (!hex || !hex.length) { return null; }
        if (hex.indexOf("#") != 0) hex = "#" + hex;
        return (new Color()).fromHEX(hex);
    }

    // 将节点和其子节点设置为指定的 Layer
    public static setNodeLayer(node: Node, layer: Layers.Enum) {
        node.layer = layer
        node.getChildByName("消消四边形").layer = layer
        node.getChildByName("消消四边形").getChildByName("柱体").layer = layer
    }

    // 获取当前的关卡
    public static getCurrentLevel() {
        return Config.levelConfig[DataMgr.currentLevel]
    }
}


